package Metier.Controleurs;

import Donnees.DaoProduit;
import Donnees.DaoStock;
import Metier.Objets.Produit;
import Metier.Objets.Stock;
import Metier.Objets.TypeProduit;
import Presentation.FenetrePrincipale;
import Presentation.Onglet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.table.DefaultTableModel;

/**
 * Classe gestionnaire gérant le paramétrage des produits
 */
public class GestionParamProduit {
   
    /**
     * Attributs
     */
    private final DaoProduit daoProduit;
    private final DaoStock daoStock;
    private final ResourceBundle configBundle;
    private final Onglet onglet;
    
    /**
     * Constructeur par défaut
     */
    public GestionParamProduit() {
        this.daoProduit = new DaoProduit();
        this.daoStock = new DaoStock();
        this.onglet = null;
        
        if (onglet == null) {
            this.configBundle = ResourceBundle.getBundle("ressources/Config/Config", Locale.FRENCH);
        } else {
            this.configBundle = ResourceBundle.getBundle("ressources/Config/Config", onglet.getFP().getLocale());
        }
    }
    
    /**
     * Constructeur avec paramètre
     * @param onglet onglet créant le gestionnaire
     */
    public GestionParamProduit(Onglet onglet) {
        this.daoProduit = new DaoProduit();
        this.daoStock = new DaoStock();
        this.onglet = onglet;
        
        if (onglet == null) {
            this.configBundle = ResourceBundle.getBundle("ressources/Config/Config", Locale.FRENCH);
        } else {
            this.configBundle = ResourceBundle.getBundle("ressources/Config/Config", onglet.getFP().getLocale());
        }
    }
    
    
    
    /**
     * Lance l'ajout d'un produit de type viennoiserie en base de données
     * @param nom  nom du produit
     * @param typeProduit  type du produit
     * @param prix  prix du produit
     * @param seuilStock  seuil de stock du produit
     * @param seuilVitrine  seuil de vitrine du produit
     * @param seuilVitrineHDP  seuil de vitrine en heures de pointe du produit
     * @param tempsCuisson  temps de cuisson du produit
     * @param dureeVie  durée de vie du produit
     */
    public void ajouterProduit(String nom, TypeProduit typeProduit, float prix, int seuilStock, int seuilVitrine, int seuilVitrineHDP, int tempsCuisson, int dureeVie){
        try{
            //Si le produit est une viennoiserie, alors on crée un objet produit avec tout ses attributs obligatoires
            this.daoProduit.ajouter(new Produit(nom, typeProduit, prix, seuilStock, seuilVitrine, seuilVitrineHDP, tempsCuisson, dureeVie));
        }
        catch(SQLException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Lance l'ajout d'un produit de type boisson en base de données
     * @param nom  nom du produit
     * @param typeProduit  type du produit
     * @param prix  prix du produit
     * @param seuilStock  seuil de stock du produit
     * @param seuilVitrine  seuil de vitrine du produit
     * @param seuilVitrineHDP  seuil de vitrine en heures de pointe du produit
     */
    public void ajouterProduit(String nom, TypeProduit typeProduit, float prix, int seuilStock, int seuilVitrine, int seuilVitrineHDP){
        try{
            //Sinon, on crée un produit avec les attributs "Temps de cuisson" et "Durée de vie" à null
            this.daoProduit.ajouter(new Produit(nom, typeProduit, prix, seuilStock, seuilVitrine, seuilVitrineHDP));
        }
        catch(SQLException e){
            System.out.println(e.toString());
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            System.out.println(e.toString());
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Lance la suppression d'un produit en base de données
     * @param p produit à supprimer
     */
    public void supprimerProduit(Produit p){
        
        try{
            //Suppression des stocks associés au produit
            List<Stock> listStock = this.daoStock.chercherStockParProduit(p);
            for(Stock s : listStock){
                this.daoStock.supprimer(s);
            }
            
            //Suppression du produit
            this.daoProduit.supprimer(p.getId());
        }catch (SQLException e) {
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Lance la mise à jour des paramètres d'un produit en base de données
     * @param idProduit  identiant du produit à mettre à jour
     * @param nom  nom du produit
     * @param typeProduit  type du produit
     * @param prix  prix du produit
     * @param seuilStock  seuil de stock du produit
     * @param seuilVitrine  seuil de vitrine du produit
     * @param seuilVitrineHDP  seuil de vitrine en heures de pointe du produit
     * @param tempsCuisson  temps de cuisson du produit
     * @param dureeVie  durée de vie du produit
     */
    public void mettreAJourProduit(int idProduit, String nom, TypeProduit typeProduit, float prix, int seuilStock, int seuilVitrine, int seuilVitrineHDP, int tempsCuisson, int dureeVie){
        
        try{
            this.daoProduit.modifier(new Produit(idProduit, nom, typeProduit, prix, seuilStock, seuilVitrine, seuilVitrineHDP, tempsCuisson, dureeVie));
        }
        catch(SQLException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Lance la mise à jour des paramètres d'un produit en base de données
     * @param idProduit  identiant du produit à mettre à jour
     * @param nom  nom du produit
     * @param typeProduit  type du produit
     * @param prix  prix du produit
     * @param seuilStock  seuil de stock du produit
     * @param seuilVitrine  seuil de vitrine du produit
     * @param seuilVitrineHDP  seuil de vitrine en heures de pointe du produit
     */
    public void mettreAJourProduit(int idProduit, String nom, TypeProduit typeProduit, float prix, int seuilStock, int seuilVitrine, int seuilVitrineHDP){
        
        try{
            this.daoProduit.modifier(new Produit(idProduit, nom, typeProduit, prix, seuilStock, seuilVitrine, seuilVitrineHDP));
        }
        catch(SQLException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
    }
    
    /**
     * Retourne un produit avec l'identifiant spécifié
     * @param idProduit  identifiant du produit
     * @return Objet produit cherché
     */
    public Produit getProduit(int idProduit){
        try{
            return this.daoProduit.chercher(idProduit);
        }
        catch(SQLException e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
        return null;
    }
    
    /**
     * Permet de récupérer le contenu du tableau des paramètres de produit avec l'entête des colonnes et le contenu
     * @return 
     */
    public DefaultTableModel getContenuTableauGeneral() {
        DefaultTableModel tableModel = new DefaultTableModel();
        tableModel.addColumn(configBundle.getString("config.produit"));
        tableModel.addColumn(configBundle.getString("config.tempscuisson"));
        tableModel.addColumn(configBundle.getString("config.tempsperemption"));
        tableModel.addColumn(configBundle.getString("config.seuilalertevitrine"));
        tableModel.addColumn(configBundle.getString("config.seuilalertehdp"));
        tableModel.addColumn(configBundle.getString("config.seuilcommandefournisseur"));
        tableModel.addColumn(configBundle.getString("config.prixunitaire"));
        tableModel.addColumn(configBundle.getString("config.editer"));
        tableModel.addColumn(configBundle.getString("config.supprimer"));
        tableModel.addColumn("id");
        Object[] rowdata = new Object[10];
        try {
            List<Produit> listProduits = daoProduit.chercher();
            
            for(Produit p : listProduits) {
                rowdata[0] = p.getNom();
                if(p.getType() == TypeProduit.VIENNOISERIE){
                    rowdata[1] = miseEnFormeSecondes(p.getTempsCuisson());
                    rowdata[2] = p.getDureeVie() + "h";
                }
                else{
                    rowdata[1] = "("+configBundle.getString("config.boisson")+")";
                    rowdata[2] = "("+configBundle.getString("config.boisson")+")";
                }
                rowdata[3] = p.getSeuilVitrine();
                rowdata[4] = p.getSeuilVitrineHDP();
                rowdata[5] = p.getSeuilStock();
                rowdata[6] = p.getPrix() + "€";
                rowdata[7] = configBundle.getString("config.editer");
                rowdata[8] = configBundle.getString("config.supprimer");
                rowdata[9] = p.getId();
                
                tableModel.addRow(rowdata);
            }
        } catch (SQLException e) {
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurbdd"));
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
        return tableModel;
    }
    
    /**
     * Retourne une chaîne " xxhxxminxxs" à partir d'une durée en secondes
     * @param dureeSecondes  durée en secondes
     * @return  une chaîne " xxhxxminxxs"
     */
    private String miseEnFormeSecondes(int dureeSecondes){
        try{
            int heures, minutes, secondes;
            DecimalFormat df = new DecimalFormat("00");
        
            secondes = dureeSecondes % 60;
            minutes = (dureeSecondes / 60) % 60;
            heures = (dureeSecondes / (60 * 60));
         
            return df.format(heures) + "h " + df.format(minutes) + "min " + df.format(secondes) + "s";  
        }
        catch(Exception e){
            e.printStackTrace();
            FenetrePrincipale.afficherPopupErreur(configBundle.getString("config.erreurinterne"));
        }
        return null;  
    }
}

